package fa7.socialcode.web;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import fa7.socialcode.model.Example;
import fa7.socialcode.service.ExampleManager;

public class ExampleForm {
  private final Log log = LogFactory.getLog(ExampleForm.class);
  private String id;
  public Example example = new Example();
  public ExampleManager mgr;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public Example getExample() {
    return example;
  }

  public void setExample(Example example) {
    this.example = example;
  }

  public void setExampleManager(ExampleManager exampleManager) {
    this.mgr = exampleManager;
  }

  public String edit() {

    if (id != null) {
      // assuming edit
      setExample(mgr.findExample(id));
    }

    return "success";
  }

  public String save() {
    Example ex = getExample();
    if (ex.getId() == 0) {
      ex.setId(null);
    }
    mgr.saveExample(ex);
    addMessage("example.saved", getExample().getName());

    return "success";
  }

  public String delete() {
    mgr.removeExample(getExample().getId().toString());
    addMessage("example.deleted", getExample().getName());

    return "success";
  }

  // Convenience methods ====================================================
  public static String getRequestParameter(String name) {
    return (String) FacesContext.getCurrentInstance().getExternalContext()
        .getRequestParameterMap().get(name);
  }

  public void addMessage(String key, String arg) {
    // sure is a lot of work to get the named ResourceBundle in JSF, eh?
    ApplicationFactory factory = (ApplicationFactory) FactoryFinder
        .getFactory(FactoryFinder.APPLICATION_FACTORY);
    String bundleName = factory.getApplication().getMessageBundle();
    ResourceBundle messages = ResourceBundle.getBundle(bundleName);

    // it's even more work to format a message with args
    MessageFormat form = new MessageFormat(messages.getString(key));

    String msg = form.format(new Object[] { arg });

    // add message to session so it can live past redirects
    // the MessageFilter class will take care of removing it
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
        .getExternalContext().getSession(true);
    session.setAttribute("message", msg);
  }
}
